home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
eshot
/
3
/
eshot.c
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
3KB
|
162 lines
/* eshot.c */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <sys/iocs.h>
#include "XSP2lib.H"
#define PCG_MAX 32 /* パターンデータの個数 */
static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
static unsigned short pal_dat[16][15]; /* パレットデータ */
#define ESHOT_MAX 200 /* 敵弾最大数 */
signed short eshot_x[ESHOT_MAX]; /* 敵弾のX座標 */
signed short eshot_y[ESHOT_MAX]; /* 〃 Y座標 */
unsigned char eshot_type[ESHOT_MAX]; /* 〃 種類(=0 なら未使用) */
/* 関数プロトタイプ宣言 */
void EshotFree (unsigned short);
/* ゲーム開始時に呼ばれる */
void EshotInit (void)
{
int i;
for (i = 0; i < ESHOT_MAX; i++)
eshot_type[i] = 0; /* 全部未使用に */
}
/* 敵弾出現時に呼ばれる */
/* 引き数 : 種類, X座標, Y座標 */
void EshotAlloc (unsigned short type, signed short x, signed short y)
{
int i;
for (i = 0; i < ESHOT_MAX; i++) {
/* 未使用のワークを見つける */
if (eshot_type[i] == 0) {
/* 未使用のワークを見つけた */
eshot_x[i] = x;
eshot_y[i] = y;
eshot_type[i] = type;
break; /* for ループを抜ける */
}
}
}
/* 垂直同期ごとに呼ばれる */
void EshotMove (void)
{
int i;
for (i = 0; i < ESHOT_MAX; i++) {
/* そのワークは使用中か? */
if (eshot_type[i] != 0) {
/* 使用中のワークを見つけた */
eshot_x[i] += 4; /* 4ドット右に移動 */
eshot_y[i] += 4; /* 4ドット下に移動 */
/* 画面外にでたら敵弾を消去(未使用)に */
if ((eshot_x[i] > 256) || (eshot_y[i] > 256)) {
EshotFree (i);
} else {
/* 座標(eshot_x,eshot_y), スプライト No.1, パレット3, 優先順位 $3f */
xsp_set (eshot_x[i], eshot_y[i], 1, 0x033f);
}
}
}
}
/* 敵弾消去時に呼ばれる */
void EshotFree (unsigned short i)
{
eshot_type[i] = 0; /* 未使用に */
}
int main (int argc, char *argv[])
{
FILE *fp;
int i, j;
int game_over = 0;
if (argc != 1) {
printf (
"敵弾テストその3 ESHOT.X\n"
" programmed by Mitsuky <FreeSoftware>\n"
"複数の弾を配列を使って処理してみます\n"
);
exit (-1);
}
_iocs_crtmod (10); /* 256x256ドット グラフィック画面 256色 2画面 */
_iocs_sp_init (); /* スプライトの初期化 */
_iocs_sp_on ();
/* pcg_dat にパターンデータを読み込む */
fp = fopen ("ESHOT.SP", "rb");
fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
fclose (fp);
/* pal_buf に一旦パレットデータを読み込む */
fp = fopen ("ESHOT.PAL", "rb");
fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
fclose (fp);
/* パレットデータを定義 */
/* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
{
unsigned short *p = (unsigned short *) pal_dat;
for (i = 1; i < 15; i++)
for (j = 0; j < 16; j++)
_iocs_spalet (0x80000000 | j, i, *p++);
}
xsp_on ();
xsp_mode (3);
/* パターンデータを定義 */
xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
printf ("ジョイスティックの\n"
" [B] ボタンを押すと弾を撃ちます\n"
" [A] ボタンを押すと終了します\n");
EshotInit ();
do {
xsp_vsync (0); /* 垂直同期待ち */
j = _iocs_joyget (0); /* ジョイスティック0番 */
/* [A] ボタンが押されたか? */
if ((j & 0b00100000) == 0)
game_over = !0; /* ゲームオーバーに */
/* [B] ボタンが押されたか? */
if ((j & 0b1000000) == 0)
EshotAlloc (1, 32, 32); /* 種類1 の敵弾を座標(32,32)に発生 */
EshotMove ();
xsp_out (); /* 表示 */
} while (!game_over);
xsp_off ();
_iocs_crtmod (16);
return (0);
}